import argparse

def get_args():
    parser = argparse.ArgumentParser("Hierarchical MADDPG for Multi-UAV Multi-Target Encirclement")
    
    # 环境参数
    parser.add_argument("--scenario-name", type=str, default="hierarchical_encirclement", help="环境名称")
    parser.add_argument("--num-uavs", type=int, default=6, help="无人机数量")
    parser.add_argument("--num-targets", type=int, default=3, help="目标数量")
    parser.add_argument("--grid-size", type=int, default=500, help="网格大小")
    
    # 部分可观测性参数
    parser.add_argument("--observation-range", type=float, default=150.0, help="无人机观测范围")
    parser.add_argument("--communication-range", type=float, default=200.0, help="无人机通信范围")
    parser.add_argument("--partial-observability", type=bool, default=True, help="是否启用部分可观测性")
    
    # 分层决策参数
    parser.add_argument("--reassignment-interval", type=int, default=10, help="目标重新分配间隔")
    # 路径规划参数
    parser.add_argument('--path_planning_method', type=str, default='hybrid', 
                       choices=['astar', 'rrt', 'potential_field', 'dijkstra', 'hybrid'],
                       help='选择路径规划算法')
    parser.add_argument('--adaptive_planning', type=bool, default=True,
                       help='是否启用自适应路径规划算法选择')
    parser.add_argument('--rrt_max_iterations', type=int, default=1000,
                       help='RRT算法最大迭代次数')
    parser.add_argument('--rrt_step_size', type=float, default=20.0,
                       help='RRT算法步长')
    parser.add_argument('--potential_field_attractive_gain', type=float, default=1.0,
                       help='势场法引力增益')
    parser.add_argument('--potential_field_repulsive_gain', type=float, default=100.0,
                       help='势场法斥力增益')
    
    # 动作空间
    parser.add_argument("--num-position-action", type=int, default=8, help="位置动作数量")
    parser.add_argument("--num-energy-action", type=int, default=3, help="能量动作数量")
    
    # 训练参数
    parser.add_argument("--max-episode-len", type=int, default=200, help="最大回合长度")
    parser.add_argument("--lr-actor", type=float, default=1e-4, help="actor学习率")
    parser.add_argument("--lr-critic", type=float, default=1e-3, help="critic学习率")
    parser.add_argument("--epsilon", type=float, default=0.3, help="探索率")
    parser.add_argument("--noise-rate", type=float, default=0.2, help="噪声率")
    parser.add_argument("--gamma", type=float, default=0.95, help="折扣因子")
    parser.add_argument("--tau", type=float, default=0.01, help="软更新参数")
    parser.add_argument("--batch-size", type=int, default=256, help="批次大小")
    parser.add_argument("--buffer-size", type=int, default=int(1e6), help="经验池大小")
    
    # 其他参数
    parser.add_argument("--save-dir", type=str, default="./model", help="模型保存路径")
    parser.add_argument("--save-rate", type=int, default=5000, help="模型保存频率")
    parser.add_argument("--evaluate", action="store_true", help="是否为评估模式")
    parser.add_argument("--evaluate-episodes", type=int, default=10, help="评估回合数")
    parser.add_argument("--seed", type=int, default=123, help="随机种子")
    
    # 学习率调度
    parser.add_argument("--lr-step-size", type=int, default=1000, help="学习率衰减步长")
    parser.add_argument("--lr-gamma", type=float, default=0.9, help="学习率衰减因子")
    
    args = parser.parse_args()
    return args
